gusucode.com > VC++ RingSDK界面库 > VC++ RingSDK界面库/code/libsrc/ringdib/rdraw.cpp

    /**********************************************************************
//
//
//        ##########                          ######  #########   # ######    #
//      #############                      ########### ######### #########  ###
//     ######## # ###  ##                 ############# ##    ## #####  # ####
//     ####  ##    ## ###                 ###     ### # #      #####   #####
//          #     ###  #            #     ##       ##  ##      ##     ###
//         ## ###### ##      ##  ####    ####          #       #     ##
//       #########  ###  ## ### #######   ######      ##      ##    ###
//      ######      ##  ######  ##  ##       ####     #      ##     ####
//     #######     ##   ###### ##  ###          ##   ##     ###    ######
//     #########   ##  ###### ## ######         ### ##    ###      #  #####
//    ##    ###### ####### ### #### ##  ## #######  ########      ##    ####
//    ##      #### ###  #  ### ### ##  ##########   ######       ##      ####
//   ##         ##                ##   #########    ####         #         ##
//               #              ###
//                              ##
//                             ###
//                             ##
//
//
//							RingSDK多媒体类库 ringdib.lib
//作者:临风
//
//版本:1.0
//
//声明:本类库可以自由使用而不须对作者作出任何回报,但作者希望能得到
//		  你的鼓励和支持。你可以对类库源码作出修改和改进,但希望你能在
//		  修改的同时给作者一份同样的副本。
//		  本类库不得用于任何商业用途,如确实需要,请与作者联系。
//
//e-mail:ringphone@sina.com
//
//原文件名:rdraw.cpp
//
//说明:图象显示部分RingDraw类的定义
//
**********************************************************************/
#define MAKE_SELF_LIB
#include "ringdib.h"

RingDIB* _rBack = NULL;

HDRAWDIB RingDraw::m_hDrawDib = NULL;
int RingDraw::m_count = 0;
BOOL RingDraw::m_bWithBack = FALSE;
BITMAPINFO RingDraw::m_bmif = {{sizeof(BITMAPINFOHEADER),0,0,1,32,BI_RGB,0,0,0,0,0,}};

HDRAWDIB RingDraw::Open()
{
   if(!m_hDrawDib)
   	m_hDrawDib = DrawDibOpen();

   m_count ++;

   return m_hDrawDib;
}

void RingDraw::Close()
{
   m_count --;

   if(m_bWithBack && m_count == 1)
      FreeBack();

   if(m_count == 0)
   {
   	DrawDibClose(m_hDrawDib);
      m_hDrawDib = NULL;
   }
}

BOOL RingDraw::Draw(HDC hDC,RingDIB* rdib,UINT wFlags)
{
	if(rdib->Data())
   {
	   m_bmif.bmiHeader.biWidth=rdib->m_width;
	   m_bmif.bmiHeader.biHeight=rdib->m_height;

   	return DrawDibDraw( m_hDrawDib,hDC,rdib->dest.left,rdib->dest.top,rdib->dest.right-rdib->dest.left,rdib->dest.bottom-rdib->dest.top,
					&(m_bmif.bmiHeader),rdib->Data(),rdib->src.left,rdib->src.top,rdib->src.right-rdib->src.left,rdib->src.bottom-rdib->src.top,wFlags );
   }
   else
   	return FALSE;
}

BOOL RingDraw::Draw(RingDIB* rdib,UINT wFlags)
{
	HDC hDC=GetDC(rdib->r_hWnd);
	BOOL bOK = Draw(hDC,rdib,wFlags);	
	ReleaseDC(rdib->r_hWnd,hDC);
   return bOK;
}

BOOL RingDraw::Paint(RingDIB* rdib,PAINTSTRUCT* lps,UINT wFlags)
{
	if(rdib->Data())
   {
	   BOOL bEnd = FALSE;
		PAINTSTRUCT ps;

		if(lps == NULL)
		{
			lps = &ps;
   		BeginPaint(rdib->r_hWnd,lps);
			bEnd = TRUE;
		}

	   m_bmif.bmiHeader.biWidth=rdib->m_width;
   	m_bmif.bmiHeader.biHeight=rdib->m_height;

	   BOOL bOK = DrawDibDraw ( m_hDrawDib, lps->hdc, rdib->dest.left,rdib->dest.top,rdib->dest.right-rdib->dest.left,rdib->dest.bottom-rdib->dest.top,
			&(m_bmif.bmiHeader), rdib->Data(),rdib->src.left,rdib->src.top,rdib->src.right-rdib->src.left,rdib->src.bottom-rdib->src.top,wFlags );

		if(bEnd)
			EndPaint(rdib->r_hWnd,lps);

   	return bOK;
   }
   else
   	return FALSE;
}

BOOL RingDraw::DrawTo(RingDIB* src,RingDIB* dest,BOOL bTrans)
{
   int i,j,a,t,r,b,x,y;
   COLORREF *Src,*Dst,*srcbak,*dstbak;

	src->CorrectDest();

   //求剪裁矩形
   x = src->dest.left + src->src.right - src->src.left;
   y = src->dest.top + src->src.bottom - src->src.top;
   r = dest->m_width > x?x:dest->m_width;
   b = dest->m_height > y?y:dest->m_height;

   a = (src->m_height - ((b - src->dest.top) + src->src.top)) * src->m_width + src->src.left;
   t = (dest->m_height - b) * dest->m_width + src->dest.left;

   srcbak = Src = src->Data() + a;
   dstbak = Dst = dest->Data() + t;

   if(src->m_crKey == 0xffffffff || !bTrans)		//不透明
      for(j=src->dest.top;j<b;j++)
      {
   		for(i=src->dest.left;i<r;i++)
      	{
            *Dst = *Src;
           	Src++;Dst++;
         }
         srcbak += src->m_width;
         dstbak += dest->m_width;
         Src = srcbak;
         Dst = dstbak;
      }
   else       //透明
      for(j=src->dest.top;j<b;j++)
      {
   		for(i=src->dest.left;i<r;i++)
      	{
            if(*Src != src->m_crKey)
	   	      *Dst = *Src;
           	Src++;Dst++;
         }
         srcbak += src->m_width;
         dstbak += dest->m_width;
         Src = srcbak;
         Dst = dstbak;
      }

   return TRUE;
}

//拉伸绘制,忽略src->dest,目标为Dest的整个图象
BOOL RingDraw::StretchTo(RingDIB* src,RingDIB* dest,BOOL bAll)
{
	COLORREF *lpData,*lpBak,*lpBako;
   COLORREF* lpdData = dest->Data();
   int width = dest->m_width;
   int height = dest->m_height;
	float sw,sh;
	int sl,st;
		      
	src->CorrectDest();

	if(bAll)	//src的整个图象
	{
		sw = (float)src->Width();
		sh = (float)src->Height();
		sl = 0;
		st = 0;
	}
	else
	{
		sw = (float)(src->src.right - src->src.left);
		sh = (float)(src->src.bottom - src->src.top);
		sl	= src->src.left;
		st = src->m_height - src->src.bottom;
		st = max(st,0);
	}

	float x = sw/(float)width;
   float y = sh/(float)height;
	float x_cnt,y_cnt=0.00;

	lpBak = lpBako = lpData = src->Data() + src->m_width * st + sl;

   for(int j=0;j<height;j++)
   {
		x_cnt=0.00;
     	for(int i=0;i<width;i++)
      {
        	*lpdData = *lpData;
         lpdData ++;

         x_cnt += x;
         lpData = lpBak + (int)x_cnt;
      }
		y_cnt += y;
  	   lpBak = lpBako + src->m_width * (int)y_cnt;
		lpData = lpBak;
   }
   return TRUE;
}

BOOL RingDraw::CopyToBack(RingDIB* rdib)
{
	int i,j,a,b,c,d;

   a=c=rdib->src.top*rdib->m_width+rdib->src.left;
   b=d=0;

   for(j=0;j<_rBack->m_height;j++)
   {
   	for(i=0;i<_rBack->m_width;i++)
     	{
     		_rBack->Data()[b]=rdib->Data()[a];
        	a++;b++;
      }
     	c+=rdib->m_width;d+=_rBack->m_width;
      a=c;b=d;
   }
   return TRUE;
}

BOOL RingDraw::CreateBack(HWND hWnd,int x,int y)
{
   if(!_rBack)
   {
	   _rBack = new RingDIB;

   	if(!_rBack)
   		return FALSE;

	   _rBack->r_hWnd = hWnd;
   	m_bWithBack = TRUE;
	   return _rBack->Create(x,y);
   }
   else
   	return TRUE;
}

void RingDraw::FreeBack(void)
{
	if(_rBack)
	   delete _rBack;
   _rBack = NULL;
   m_bWithBack = FALSE;
}